<?php
// Archivo: send_email.php
// Script mejorado para enviar correos con PHPMailer y la gráfica como archivo adjunto

// Configurar logging detallado
$logFile = 'email_log.txt';
$logEnabled = true;

function log_message($message) {
    global $logFile, $logEnabled;
    if ($logEnabled) {
        $timestamp = date('Y-m-d H:i:s');
        file_put_contents($logFile, "$timestamp - $message\n", FILE_APPEND);
    }
}

log_message("==== Nueva solicitud recibida ====");

// Verificar que las librerías necesarias estén instaladas
if (!file_exists('vendor/autoload.php')) {
    log_message("ERROR CRÍTICO: No se encontró vendor/autoload.php. ¿Se ha ejecutado 'composer require phpmailer/phpmailer'?");
    echo json_encode(['success' => false, 'message' => 'Error de configuración del servidor']);
    exit;
}

// Cargar el autoloader de Composer
require 'vendor/autoload.php';

// Importamos las clases de PHPMailer
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTP;

// Configurar la zona horaria correcta
date_default_timezone_set('America/Mexico_City');

// Verificar que la solicitud sea POST
if ($_SERVER["REQUEST_METHOD"] != "POST") {
    echo json_encode(['success' => false, 'message' => 'Método no permitido']);
    log_message("Error: Método no permitido. Se recibió: " . $_SERVER["REQUEST_METHOD"]);
    exit;
}

// Obtener los datos del formulario con un límite aumentado
$postSize = ini_get('post_max_size');
log_message("Tamaño máximo de POST configurado: $postSize");

// Obtener los datos del formulario
$recipient = isset($_POST['recipient']) ? trim($_POST['recipient']) : '';
$subject = isset($_POST['subject']) ? trim($_POST['subject']) : '';
$content = isset($_POST['content']) ? $_POST['content'] : '';
$chartImage = isset($_POST['chartImage']) ? $_POST['chartImage'] : '';

// Registrar datos recibidos (sin mostrar datos sensibles completos)
log_message("Recipient: $recipient, Subject: $subject");
log_message("Contenido recibido: " . (empty($content) ? "NO" : "SI, longitud: " . strlen($content) . " bytes"));
log_message("Imagen recibida: " . (empty($chartImage) ? "NO" : "SI, longitud: " . strlen($chartImage) . " bytes"));

// Verificar si los datos han sido truncados
$contentTruncated = isset($_SERVER['CONTENT_LENGTH']) && $_SERVER['CONTENT_LENGTH'] > strlen(file_get_contents('php://input'));
if ($contentTruncated) {
    log_message("ADVERTENCIA: Los datos POST parecen estar truncados. Tamaño recibido: " . strlen(file_get_contents('php://input')) . ", Tamaño indicado: " . $_SERVER['CONTENT_LENGTH']);
}

// Validar los datos
if (empty($recipient) || empty($subject) || empty($content)) {
    echo json_encode(['success' => false, 'message' => 'Todos los campos son obligatorios']);
    log_message("Error: Campos obligatorios faltantes");
    exit;
}

// Validar el email
if (!filter_var($recipient, FILTER_VALIDATE_EMAIL)) {
    echo json_encode(['success' => false, 'message' => 'El correo electrónico no es válido']);
    log_message("Error: Email no válido: $recipient");
    exit;
}

try {
    // Crear una nueva instancia de PHPMailer
    $mail = new PHPMailer(true);
    
    // Configurar servidor SMTP
    $mail->isSMTP();
    $mail->Host = 'smtp.hostinger.com';
    $mail->SMTPAuth = true;
    $mail->Username = 'administracion@monitoreodelagua.com';
    $mail->Password = 'Isa@280681';
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
    $mail->Port = 587;
    $mail->Timeout = 60; // Aumentar el timeout a 60 segundos
    
    // Para depuración
    $mail->SMTPDebug = SMTP::DEBUG_SERVER;
    $debugOutput = '';
    $mail->Debugoutput = function($str, $level) use (&$debugOutput) {
        log_message("SMTP Debug: $str");
        $debugOutput .= $str . "\n";
    };
    
    // Configuración de codificación
    $mail->CharSet = 'UTF-8';
    $mail->Encoding = 'base64';
    
    // Configurar remitente y destinatario
    $mail->setFrom($mail->Username, 'Sistema de Monitoreo ESP32');
    $mail->addAddress($recipient);
    $mail->addReplyTo($mail->Username, 'Sistema de Monitoreo ESP32');
    
    // Configurar el contenido del correo
    $mail->isHTML(true);
    $mail->Subject = $subject;
    
    // Preparar el contenido del mensaje
    $mailContent = $content;
    
    // Procesar la imagen de la gráfica como archivo adjunto si existe
    $imageAttached = false;
    
    if (!empty($chartImage)) {
        log_message("Procesando imagen para adjuntar");
        
        // Verificar formato de los primeros caracteres
        $prefix = substr($chartImage, 0, 30);
        log_message("Los primeros 30 caracteres recibidos: " . $prefix);
        
        // MEJORA: Manejo más robusto de la imagen base64
        $imageData = null;
        $imageType = 'png'; // Tipo por defecto
        
        // Intentar extraer los datos base64 con formato estándar data:image/xyz;base64,...
        if (preg_match('/^data:image\/(\w+);base64,(.+)$/', $chartImage, $matches)) {
            $imageType = $matches[1];
            $base64Data = $matches[2];
            $imageData = base64_decode($base64Data, true);
            log_message("Imagen detectada como tipo: $imageType");
        } 
        // Si es solo base64 sin prefijo
        elseif (preg_match('/^([A-Za-z0-9+\/]+={0,2})$/', $chartImage)) {
            $imageData = base64_decode($chartImage, true);
            log_message("Imagen detectada como base64 sin prefijo");
        }
        // Si contiene la palabra base64 pero no cumple el formato estándar
        elseif (strpos($chartImage, 'base64,') !== false) {
            $parts = explode('base64,', $chartImage, 2);
            if (isset($parts[1])) {
                $imageData = base64_decode($parts[1], true);
                log_message("Imagen extraída después de 'base64,'");
            }
        }
        // Último intento de reparación
        else {
            // Intentar decodificar tal cual, asumiendo que es base64
            $imageData = base64_decode($chartImage, true);
            log_message("Intento final de decodificación de imagen");
        }
        
        // Verificar que los datos se decodificaron correctamente
        if ($imageData !== false && !empty($imageData)) {
            // Verificar que realmente sea una imagen válida
            $finfo = new finfo(FILEINFO_MIME_TYPE);
            $mimeType = $finfo->buffer($imageData);
            
            if (strpos($mimeType, 'image/') === 0) {
                // Extraer el tipo MIME real
                $realImageType = substr($mimeType, 6); // quita "image/"
                if (!empty($realImageType)) {
                    $imageType = $realImageType;
                }
                
                log_message("Tipo MIME detectado: $mimeType");
                
                // Crear nombre para el archivo adjunto
                $attachmentName = 'grafica_temperatura_' . date('Y-m-d_H-i-s') . '.' . $imageType;
                
                // Añadir como archivo adjunto
                $mail->addStringAttachment($imageData, $attachmentName, 'base64', $mimeType);
                $imageAttached = true;
                log_message("Imagen adjuntada correctamente como archivo: $attachmentName");
                
                // Reemplazar el marcador en el contenido
                $graphPlaceholder = '[GRÁFICA DE TEMPERATURA]';
                if (strpos($mailContent, $graphPlaceholder) !== false) {
                    $mailContent = str_replace(
                        $graphPlaceholder, 
                        '<p><i>La gráfica de temperatura se encuentra adjunta a este correo como archivo.</i></p>', 
                        $mailContent
                    );
                } else {
                    // Si no existe el marcador, añadir una nota al final
                    $mailContent .= '<p><i>La gráfica de temperatura se encuentra adjunta a este correo como archivo.</i></p>';
                }
            } else {
                log_message("Los datos decodificados no son una imagen válida. MIME detectado: $mimeType");
            }
        } else {
            log_message("Error al decodificar la imagen o datos vacíos");
        }
    }
    
    // Si no se adjuntó la imagen, reemplazar el marcador con un mensaje
    if (!$imageAttached) {
        log_message("No se adjuntó imagen o falló el proceso");
        // Añadir un texto explicativo si no se pudo incluir la gráfica
        $mailContent = str_replace(
            '[GRÁFICA DE TEMPERATURA]',
            '<p><i>(No se pudo incluir la gráfica de temperatura)</i></p>',
            $mailContent
        );
    }
    
    // Asignar el contenido al correo
    $mail->Body = $mailContent;
    
    // Versión texto plano
    $mail->AltBody = strip_tags(str_replace(
        ['<br>', '<br/>', '<br />', '<p>', '</p>', '<div>', '</div>'], 
        ["\n", "\n", "\n", "\n", "\n", "\n", "\n"], 
        $content
    ));
    
    log_message("Intentando enviar correo a: $recipient");
    
    // Enviar el correo con manejo explícito del resultado
    $sendResult = $mail->send();
    log_message("Resultado de envío: " . ($sendResult ? "ÉXITO" : "FALLO"));
    
    if ($sendResult) {
        log_message("Correo enviado exitosamente");
        echo json_encode(['success' => true, 'message' => 'Correo enviado correctamente']);
    } else {
        throw new Exception("PHPMailer no pudo enviar el correo: " . $mail->ErrorInfo);
    }
    
} catch (Exception $e) {
    // Registrar el error detallado
    $errorMsg = "Error al enviar el correo: " . (isset($mail) ? $mail->ErrorInfo : "PHPMailer no inicializado") . " - " . $e->getMessage();
    log_message($errorMsg);
    
    // Si hay un error de conexión SMTP, dar información más específica
    if (strpos($errorMsg, 'SMTP connect() failed') !== false) {
        log_message("Error de conexión SMTP. Verificar: 
            1. Que el servidor SMTP esté accesible
            2. Que el puerto 587 no esté bloqueado
            3. Que las credenciales sean correctas
            4. Configuración del firewall");
        
        // Intentar comprobar conectividad
        $smtpHost = 'smtp.hostinger.com';
        $smtpPort = 587;
        $socketTest = @fsockopen($smtpHost, $smtpPort, $errNo, $errStr, 5);
        if ($socketTest) {
            log_message("Conexión básica a $smtpHost:$smtpPort exitosa");
            fclose($socketTest);
        } else {
            log_message("Fallo al conectar a $smtpHost:$smtpPort - Error $errNo: $errStr");
        }
    }
    
    // Respuesta de error para el cliente
    echo json_encode([
        'success' => false, 
        'message' => 'Error al enviar el correo', 
        'details' => $errorMsg
    ]);
}

// Cerrar el log de esta solicitud
log_message("==== Fin de solicitud ====\n");
?>